package com.it.reggie.Service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.it.reggie.Mapper.SetmealMapper;
import com.it.reggie.Service.SetmealDishService;
import com.it.reggie.Service.SetmealService;
import com.it.reggie.common.CustomException;
import com.it.reggie.common.R;
import com.it.reggie.dto.SetmealDto;
import com.it.reggie.entity.Setmeal;
import com.it.reggie.entity.SetmealDish;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealMapper setmealMapper;

    @Autowired
    private SetmealDishService setmealDishService;


    @Override
    public int querysetMeal(Long id) {
        int i = setmealMapper.querysetMeal(id);
        return i;
    }

    @Override
    public void sevaWithDish(SetmealDto setmealDto) {

        // 1、把封装在DTO实体类当中的套餐表中的数据先添加到套餐表setmeal当中
        this.save(setmealDto);

        //2.把客户端传递过来封装在DTO实体类setmealDto当中的属性遍历出来，为其添加上套餐表中对应id
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();

        // 遍历其封装在DTO实体类属性集合当中的套餐菜品数据，（在集合当中是以套餐菜品实体类setmealDish实体类对象形式封装在List集合当中的）
        for (SetmealDish setmealDish:setmealDishes){    // setmealDish ：这个就是集合里面封装的套餐菜品数据的对象，我们可以为其对象的setmeal_id属性设置上套餐id，
                                                        // 最后再保存到套餐菜品数据库当中那么套餐菜品数据库当中的setmeal_id字段就和套餐的id字段一样了，
                                                        // 我们就知道这几个菜是哪个套餐里面的菜了哈哈
            // 3、获取到一个个封装的套餐菜品数据后，为其套餐菜品表dish_id属性设置上套餐id，然后再一起保存到套餐菜品数据库当中
            setmealDish.setSetmealId(setmealDto.getId());  // 将套餐id设置到套餐菜品的setmealId属性当中（就相当于设置到套餐菜品表的setmeal_Id）
            // 设置好后，我们就知道套餐菜品表中的这几个菜是他妈哪个套餐里面的菜了。

            // 4、调用套餐菜品数据层进行保存数据功能
            setmealDishService.save(setmealDish);

        }
    }


    @Override
    @Transactional
    public void delete(List<Long> ids) {
        LambdaQueryWrapper<Setmeal> LambdaqueryWrapper = new LambdaQueryWrapper<>();

        LambdaqueryWrapper.in(ids!=null,Setmeal::getId,ids);
        // 相当于拼接一个这样的sql语句条件：where id in (ids)；
        // 也就是说把客户端传递想要删除的套餐id对应在数据库中的套餐数据先获取出来。

        LambdaqueryWrapper.eq(Setmeal::getStatus,0);  // 也就是说再为sql语句拼接一个 status = 0；

        /**
         *  通过上面的两个条件的过滤后，我们的sql基本上就成这个类型了：
         *      也就是说刚好可以把客户端想要批量删除的套餐数据并且是停售状态的数据给查询出来了。
         *      SELECT * FROM setmeal WHERE (id IN (?,?,?,?) AND status = ?)
         *      满足这个sql条件的话，我们就让客户端进行删除操作，不满足就滚蛋
         */

        List<Setmeal> list = this.list(LambdaqueryWrapper);



        if (list.size()>0){
            //  判断集合是否为null，不能 ！=null，用list.size()判断集合里面数据是否为0，如果大于0的话，
            //  就说明客户端想要删除的数据满足了sql条件了

            // 把List集合中满足删除套餐条件封装在Setmeal实体类对象的数据遍历出来，获取其数据在数据库中对应的id字段值
            for (Setmeal item:list){    // 把List集合中封装的Setmeal查询出来的数据对象遍历出来，
                Long id = item.getId(); // 遍历出来后，获得到此想删除的套餐数据的id

                // 获取后，就可以通过id字段一个一个删除其满足删除条件的套餐数据了。
                this.removeById(id);

                // 然后还可以通过套餐id就可以把对应的在套餐菜品数据库中的菜品删除掉了。(菜品数据有可能多个，因此需要使用条件构造器)
                LambdaQueryWrapper<SetmealDish> queryWrapper1 = new LambdaQueryWrapper<>();
                queryWrapper1.eq(SetmealDish::getSetmealId,id); // 把和上面套餐数据的id一致的套餐菜品数据查询出来，然后调用删除功能删除掉就可以了。
                setmealDishService.remove(queryWrapper1);

            }
        } else throw new CustomException("商品在售中，删除失败~");

        }

    }



